<!DOCTYPE html>
<html lang="en" dir="auto">

<head><meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="index, follow">
<title>homography | WangJV Blog</title>
<meta name="keywords" content="homography, 计算机视觉, 图像处理, 射影几何">
<meta name="description" content="假设我们有两个坐标系 $\mathcal F_a, \ \mathcal F_b$，有一个点 $P$ 在一个平面上。在两个坐标系下，这个点可以描述为 $\rho_a, \rho_b$；对应的平面可以通过法向量和截距来描述：$\{n_a. d_a\}, \{n_b. d_b\}$。
此外，该点有在图像坐标系下的描述 $p_a, p_b$ 和对应的相机矩阵 $K_a, K_b$。那么可以写出：
$$
\begin{aligned}
p_a = \frac{1}{z_a} K_a \rho_a \\
p_b = \frac{1}{z_b} K_b \rho_b
\end{aligned}
$$此外， 由于该点在对应的平面上，有平面约束：
$$
\begin{aligned}
n^T_a \rho_a &#43; d_a = 0 \\
n^T_b \rho_b &#43; d_b = 0
\end{aligned}
$$那么，将平面约束中的 $\rho$ 通过投影矩阵转换为像素坐标，有：
$$
\begin{aligned}
&z_a n^T_a K_a^{-1} p_a &#43; d_a = 0\\
&z_a = -\frac{d_a}{n^T_a K_a^{-1} p_a}\\
&z_b n^T_b K_b^{-1} p_b &#43; d_b = 0\\
&z_b = -\frac{d_b}{n^T_b K_b^{-1} p_b}\\
\end{aligned}
$$带入到 $\rho_a, \rho_b$ 的表达式中，有：">
<meta name="author" content="WangJV">
<link rel="canonical" href="https://wangjv0812.github.io/WangJV-Blog-Pages/2025/02/homography/">
<link crossorigin="anonymous" href="https://wangjv0812.github.io/WangJV-Blog-Pages/assets/css/stylesheet.8fe10233a706bc87f2e08b3cf97b8bd4c0a80f10675a143675d59212121037c0.css" integrity="sha256-j&#43;ECM6cGvIfy4Is8&#43;XuL1MCoDxBnWhQ2ddWSEhIQN8A=" rel="preload stylesheet" as="style">
<link rel="icon" href="https://wangjv0812.github.io/WangJV-Blog-Pages/favicon.ico">
<link rel="icon" type="image/png" sizes="16x16" href="https://wangjv0812.github.io/WangJV-Blog-Pages/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="https://wangjv0812.github.io/WangJV-Blog-Pages/favicon-32x32.png">
<link rel="apple-touch-icon" href="https://wangjv0812.github.io/WangJV-Blog-Pages/apple-touch-icon.png">
<link rel="mask-icon" href="https://wangjv0812.github.io/WangJV-Blog-Pages/safari-pinned-tab.svg">
<meta name="theme-color" content="#2e2e33">
<meta name="msapplication-TileColor" content="#2e2e33">
<link rel="alternate" hreflang="en" href="https://wangjv0812.github.io/WangJV-Blog-Pages/2025/02/homography/">
<noscript>
    <style>
        #theme-toggle,
        .top-link {
            display: none;
        }

    </style>
    <style>
        @media (prefers-color-scheme: dark) {
            :root {
                --theme: rgb(29, 30, 32);
                --entry: rgb(46, 46, 51);
                --primary: rgb(218, 218, 219);
                --secondary: rgb(155, 156, 157);
                --tertiary: rgb(65, 66, 68);
                --content: rgb(196, 196, 197);
                --code-block-bg: rgb(46, 46, 51);
                --code-bg: rgb(55, 56, 62);
                --border: rgb(51, 51, 51);
            }

            .list {
                background: var(--theme);
            }

            .list:not(.dark)::-webkit-scrollbar-track {
                background: 0 0;
            }

            .list:not(.dark)::-webkit-scrollbar-thumb {
                border-color: var(--theme);
            }
        }

    </style>
</noscript><script>
  MathJax = {
    tex: {
      displayMath: [['\\[', '\\]'], ['$$', '$$']],
      inlineMath: [['\\(', '\\)'], ['$', '$']],
      processEscapes: true,
      processEnvironments: true,
      tags: 'ams'
    },
    chtml: {
      scale: 1,                     
      minScale: 0.5,               
      matchFontHeight: false,       
      displayAlign: 'center',       
      displayIndent: '0',           
      mtextInheritFont: false,      
      merrorInheritFont: true,      
      mathmlSpacing: false,         
      skipHtmlTags: ['script','noscript','style','textarea','pre','code','a'],
      ignoreHtmlClass: 'tex2jax_ignore',
      processHtmlClass: 'tex2jax_process'
    },
    svg: {
      scale: 1,                     
      minScale: 0.5,               
      mtextInheritFont: false,      
      merrorInheritFont: true,
      mathmlSpacing: false,
      skipHtmlTags: ['script','noscript','style','textarea','pre','code','a'],
      ignoreHtmlClass: 'tex2jax_ignore',
      processHtmlClass: 'tex2jax_process'
    },
    options: {
      enableMenu: true,             
      menuOptions: {
        settings: {
          zoom: 'Click'             
        }
      }
    },
    loader: {
      load: ['ui/safe', 'a11y/assistive-mml']
    },
    startup: {
      ready() {
        MathJax.startup.defaultReady();
        
        const observer = new ResizeObserver(entries => {
          MathJax.typesetPromise();
        });
        observer.observe(document.body);
      }
    }
  };
  
  
  if (window.innerWidth <= 768) {
    MathJax.chtml = MathJax.chtml || {};
    MathJax.chtml.scale = 0.9;  
  }
</script>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"></script>


<style>
   
  .MathJax {
    outline: 0;
  }
  
   
  @media (max-width: 768px) {
    .MathJax {
      font-size: 90% !important;
    }
    
     
    .MathJax_Display {
      overflow-x: auto;
      overflow-y: hidden;
      padding: 0 !important;
      margin: 1em 0 !important;
    }
    
     
    .MathJax_CHTML {
      line-height: 1.2 !important;
    }
  }
  
   
  mjx-container[jax="CHTML"][display="true"] {
    overflow-x: auto;
    overflow-y: hidden;
    padding: 1px 0;
  }
</style><meta property="og:url" content="https://wangjv0812.github.io/WangJV-Blog-Pages/2025/02/homography/">
  <meta property="og:site_name" content="WangJV Blog">
  <meta property="og:title" content="homography">
  <meta property="og:description" content="假设我们有两个坐标系 $\mathcal F_a, \ \mathcal F_b$，有一个点 $P$ 在一个平面上。在两个坐标系下，这个点可以描述为 $\rho_a, \rho_b$；对应的平面可以通过法向量和截距来描述：$\{n_a. d_a\}, \{n_b. d_b\}$。
此外，该点有在图像坐标系下的描述 $p_a, p_b$ 和对应的相机矩阵 $K_a, K_b$。那么可以写出：
$$ \begin{aligned} p_a = \frac{1}{z_a} K_a \rho_a \\ p_b = \frac{1}{z_b} K_b \rho_b \end{aligned} $$此外， 由于该点在对应的平面上，有平面约束：
$$ \begin{aligned} n^T_a \rho_a &#43; d_a = 0 \\ n^T_b \rho_b &#43; d_b = 0 \end{aligned} $$那么，将平面约束中的 $\rho$ 通过投影矩阵转换为像素坐标，有：
$$ \begin{aligned} &amp;z_a n^T_a K_a^{-1} p_a &#43; d_a = 0\\ &amp;z_a = -\frac{d_a}{n^T_a K_a^{-1} p_a}\\ &amp;z_b n^T_b K_b^{-1} p_b &#43; d_b = 0\\ &amp;z_b = -\frac{d_b}{n^T_b K_b^{-1} p_b}\\ \end{aligned} $$带入到 $\rho_a, \rho_b$ 的表达式中，有：">
  <meta property="og:locale" content="en-us">
  <meta property="og:type" content="article">
    <meta property="article:section" content="posts">
    <meta property="article:published_time" content="2025-02-14T17:13:56+08:00">
    <meta property="article:modified_time" content="2025-02-14T17:13:56+08:00">
    <meta property="article:tag" content="Homography">
    <meta property="article:tag" content="计算机视觉">
    <meta property="article:tag" content="图像处理">
    <meta property="article:tag" content="射影几何">
      <meta property="og:image" content="https://wangjv0812.github.io/WangJV-Blog-Pages/">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://wangjv0812.github.io/WangJV-Blog-Pages/">
<meta name="twitter:title" content="homography">
<meta name="twitter:description" content="假设我们有两个坐标系 $\mathcal F_a, \ \mathcal F_b$，有一个点 $P$ 在一个平面上。在两个坐标系下，这个点可以描述为 $\rho_a, \rho_b$；对应的平面可以通过法向量和截距来描述：$\{n_a. d_a\}, \{n_b. d_b\}$。
此外，该点有在图像坐标系下的描述 $p_a, p_b$ 和对应的相机矩阵 $K_a, K_b$。那么可以写出：
$$
\begin{aligned}
p_a = \frac{1}{z_a} K_a \rho_a \\
p_b = \frac{1}{z_b} K_b \rho_b
\end{aligned}
$$此外， 由于该点在对应的平面上，有平面约束：
$$
\begin{aligned}
n^T_a \rho_a &#43; d_a = 0 \\
n^T_b \rho_b &#43; d_b = 0
\end{aligned}
$$那么，将平面约束中的 $\rho$ 通过投影矩阵转换为像素坐标，有：
$$
\begin{aligned}
&z_a n^T_a K_a^{-1} p_a &#43; d_a = 0\\
&z_a = -\frac{d_a}{n^T_a K_a^{-1} p_a}\\
&z_b n^T_b K_b^{-1} p_b &#43; d_b = 0\\
&z_b = -\frac{d_b}{n^T_b K_b^{-1} p_b}\\
\end{aligned}
$$带入到 $\rho_a, \rho_b$ 的表达式中，有：">


<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position":  1 ,
      "name": "Posts",
      "item": "https://wangjv0812.github.io/WangJV-Blog-Pages/posts/"
    }, 
    {
      "@type": "ListItem",
      "position":  2 ,
      "name": "homography",
      "item": "https://wangjv0812.github.io/WangJV-Blog-Pages/2025/02/homography/"
    }
  ]
}
</script>
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": "homography",
  "name": "homography",
  "description": "假设我们有两个坐标系 $\\mathcal F_a, \\ \\mathcal F_b$，有一个点 $P$ 在一个平面上。在两个坐标系下，这个点可以描述为 $\\rho_a, \\rho_b$；对应的平面可以通过法向量和截距来描述：$\\{n_a. d_a\\}, \\{n_b. d_b\\}$。\n此外，该点有在图像坐标系下的描述 $p_a, p_b$ 和对应的相机矩阵 $K_a, K_b$。那么可以写出：\n$$ \\begin{aligned} p_a = \\frac{1}{z_a} K_a \\rho_a \\\\ p_b = \\frac{1}{z_b} K_b \\rho_b \\end{aligned} $$此外， 由于该点在对应的平面上，有平面约束：\n$$ \\begin{aligned} n^T_a \\rho_a + d_a = 0 \\\\ n^T_b \\rho_b + d_b = 0 \\end{aligned} $$那么，将平面约束中的 $\\rho$ 通过投影矩阵转换为像素坐标，有：\n$$ \\begin{aligned} \u0026z_a n^T_a K_a^{-1} p_a + d_a = 0\\\\ \u0026z_a = -\\frac{d_a}{n^T_a K_a^{-1} p_a}\\\\ \u0026z_b n^T_b K_b^{-1} p_b + d_b = 0\\\\ \u0026z_b = -\\frac{d_b}{n^T_b K_b^{-1} p_b}\\\\ \\end{aligned} $$带入到 $\\rho_a, \\rho_b$ 的表达式中，有：\n",
  "keywords": [
    "homography", "计算机视觉", "图像处理", "射影几何"
  ],
  "articleBody": "假设我们有两个坐标系 $\\mathcal F_a, \\ \\mathcal F_b$，有一个点 $P$ 在一个平面上。在两个坐标系下，这个点可以描述为 $\\rho_a, \\rho_b$；对应的平面可以通过法向量和截距来描述：$\\{n_a. d_a\\}, \\{n_b. d_b\\}$。\n此外，该点有在图像坐标系下的描述 $p_a, p_b$ 和对应的相机矩阵 $K_a, K_b$。那么可以写出：\n$$ \\begin{aligned} p_a = \\frac{1}{z_a} K_a \\rho_a \\\\ p_b = \\frac{1}{z_b} K_b \\rho_b \\end{aligned} $$此外， 由于该点在对应的平面上，有平面约束：\n$$ \\begin{aligned} n^T_a \\rho_a + d_a = 0 \\\\ n^T_b \\rho_b + d_b = 0 \\end{aligned} $$那么，将平面约束中的 $\\rho$ 通过投影矩阵转换为像素坐标，有：\n$$ \\begin{aligned} \u0026z_a n^T_a K_a^{-1} p_a + d_a = 0\\\\ \u0026z_a = -\\frac{d_a}{n^T_a K_a^{-1} p_a}\\\\ \u0026z_b n^T_b K_b^{-1} p_b + d_b = 0\\\\ \u0026z_b = -\\frac{d_b}{n^T_b K_b^{-1} p_b}\\\\ \\end{aligned} $$带入到 $\\rho_a, \\rho_b$ 的表达式中，有：\n$$ \\begin{aligned} \\rho_a = -\\frac{d_a}{n^T_a K_a^{-1} p_a} K_a^{-1} p_a \\\\ \\rho_b = -\\frac{d_b}{n^T_b K_b^{-1} p_b} K_b^{-1} p_b \\end{aligned} $$我们知道，$\\rho_a, \\rho_b$ 之间有一个变换矩阵 $T_{ab}$，有：\n$$ \\rho_b = C_ba \\rho_a + r_b^{ba} $$将 $\\rho_a, \\rho_b$ 变换为像素坐标，有：\n$$ \\begin{aligned} z_b K_b^{-1} p_b \u0026= C_{ba} z_a K_a^{-1} p_a + r_b^{ba}\\\\ p_b \u0026= \\frac{z_a}{z_b} K_b C_{ba} K_a^{-1} p_a + \\frac{1}{z_b}K_b r_b^{ba} \\end{aligned} $$将 $\\frac{1}{z_b}$ 变换为 $\\frac{z_a}{z_b}\\frac{1}{z_a}$ ，且带入 $r_b^{ab} = -C_{ba} r_a^{ba}$，有：\n$$ \\begin{aligned} p_b \u0026= \\frac{z_a}{z_b} K_b C_{ba} K_a^{-1} p_a + \\frac{z_a}{z_b} K_b C_{ba} r_a^{ba}\\frac{n^T_a K_a^{-1} p_a}{d_a}\\\\ \u0026= \\frac{z_a}{z_b} K_b C_{ba} K_a^{-1} p_a + \\frac{z_a}{z_b} K_b C_{ba} r_a^{ba}\\frac{n^T_a}{d_a} K_a^{-1} p_a\\\\ \u0026= \\frac{z_a}{z_b} K_b C_{ba} \\left( 1 + \\frac{r_a^{ba}n^T_a}{d_a} \\right)K_a^{-1}p_a \\end{aligned} $$其中 $\\frac{z_a}{z_b}$ 为一个系数，可以被齐次坐标吸收。有：\n$$ p_b = K_b C_{ba} \\left( 1 + \\frac{r_a^{ba}n^T_a}{d_a} \\right)K_a^{-1}p_a $$其中：\n$$ H_{ba} = C_{ba} \\left( 1 + \\frac{r_a^{ba} n_a^T}{d_a} \\right) $$我们可以写出：\n$$ K_b^{-1} p_b = H_{ba} K_a^{-1} p_a $$我们可以这样理解：\n$K_b^{-1} p_b$ 和 $K_a^{-1} p_a$ 为归一化坐标系下的点 $H_{ba}$ 为一个 $3 \\times 3$ 的矩阵，描述了两个归一化坐标系之间的变换 ",
  "wordCount" : "236",
  "inLanguage": "en",
  "image": "https://wangjv0812.github.io/WangJV-Blog-Pages/","datePublished": "2025-02-14T17:13:56+08:00",
  "dateModified": "2025-02-14T17:13:56+08:00",
  "author":{
    "@type": "Person",
    "name": "WangJV"
  },
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://wangjv0812.github.io/WangJV-Blog-Pages/2025/02/homography/"
  },
  "publisher": {
    "@type": "Organization",
    "name": "WangJV Blog",
    "logo": {
      "@type": "ImageObject",
      "url": "https://wangjv0812.github.io/WangJV-Blog-Pages/favicon.ico"
    }
  }
}
</script>
</head>

<body class="" id="top">
<script>
    if (localStorage.getItem("pref-theme") === "dark") {
        document.body.classList.add('dark');
    } else if (localStorage.getItem("pref-theme") === "light") {
        document.body.classList.remove('dark')
    } else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
        document.body.classList.add('dark');
    }

</script>

<header class="header">
    <nav class="nav">
        <div class="logo">
            <a href="https://wangjv0812.github.io/WangJV-Blog-Pages/" accesskey="h" title="WangJV Blog (Alt + H)">WangJV Blog</a>
            <div class="logo-switches">
                <button id="theme-toggle" accesskey="t" title="(Alt + T)" aria-label="Toggle theme">
                    <svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
                        fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
                        stroke-linejoin="round">
                        <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
                    </svg>
                    <svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
                        fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
                        stroke-linejoin="round">
                        <circle cx="12" cy="12" r="5"></circle>
                        <line x1="12" y1="1" x2="12" y2="3"></line>
                        <line x1="12" y1="21" x2="12" y2="23"></line>
                        <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
                        <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
                        <line x1="1" y1="12" x2="3" y2="12"></line>
                        <line x1="21" y1="12" x2="23" y2="12"></line>
                        <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
                        <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
                    </svg>
                </button>
            </div>
        </div>
        <ul id="menu">
            <li>
                <a href="https://wangjv0812.github.io/WangJV-Blog-Pages/" title="Home">
                    <span>Home</span>
                </a>
            </li>
            <li>
                <a href="https://wangjv0812.github.io/WangJV-Blog-Pages/posts/" title="Posts">
                    <span>Posts</span>
                </a>
            </li>
            <li>
                <a href="https://wangjv0812.github.io/WangJV-Blog-Pages/archives/" title="Archive">
                    <span>Archive</span>
                </a>
            </li>
            <li>
                <a href="https://wangjv0812.github.io/WangJV-Blog-Pages/tags/" title="Tags">
                    <span>Tags</span>
                </a>
            </li>
            <li>
                <a href="https://wangjv0812.github.io/WangJV-Blog-Pages/search/" title="🔍 Search (Alt &#43; /)" accesskey=/>
                    <span>🔍 Search</span>
                </a>
            </li>
        </ul>
    </nav>
</header>
<main class="main">

<article class="post-single">
  <header class="post-header">
    <div class="breadcrumbs"><a href="https://wangjv0812.github.io/WangJV-Blog-Pages/">Home</a>&nbsp;»&nbsp;<a href="https://wangjv0812.github.io/WangJV-Blog-Pages/posts/">Posts</a></div>
    <h1 class="post-title entry-hint-parent">
      homography
    </h1>
    <div class="post-meta"><span title='2025-02-14 17:13:56 +0800 CST'>February 14, 2025</span>&nbsp;·&nbsp;2 min&nbsp;·&nbsp;236 words&nbsp;·&nbsp;WangJV&nbsp;|&nbsp;<a href="https://github.com/WangJV0812/WangJV-Blog-Source/tree/master/content/posts/homography/index.md" rel="noopener noreferrer edit" target="_blank">Suggest Changes</a>

</div>
  </header> 

  <div class="post-content"><p>假设我们有两个坐标系 $\mathcal F_a, \ \mathcal F_b$，有一个点 $P$ 在一个平面上。在两个坐标系下，这个点可以描述为 $\rho_a, \rho_b$；对应的平面可以通过法向量和截距来描述：$\{n_a. d_a\}, \{n_b. d_b\}$。</p>
<p>此外，该点有在图像坐标系下的描述 $p_a, p_b$ 和对应的相机矩阵 $K_a, K_b$。那么可以写出：</p>
$$
\begin{aligned}
p_a = \frac{1}{z_a} K_a \rho_a \\
p_b = \frac{1}{z_b} K_b \rho_b
\end{aligned}
$$<p>此外， 由于该点在对应的平面上，有平面约束：</p>
$$
\begin{aligned}
n^T_a \rho_a + d_a = 0 \\
n^T_b \rho_b + d_b = 0
\end{aligned}
$$<p>那么，将平面约束中的 $\rho$ 通过投影矩阵转换为像素坐标，有：</p>
$$
\begin{aligned}
&z_a n^T_a K_a^{-1} p_a + d_a = 0\\
&z_a = -\frac{d_a}{n^T_a K_a^{-1} p_a}\\
&z_b n^T_b K_b^{-1} p_b + d_b = 0\\
&z_b = -\frac{d_b}{n^T_b K_b^{-1} p_b}\\
\end{aligned}
$$<p>带入到 $\rho_a, \rho_b$ 的表达式中，有：</p>
$$
\begin{aligned}
\rho_a = -\frac{d_a}{n^T_a K_a^{-1} p_a} K_a^{-1} p_a \\
\rho_b = -\frac{d_b}{n^T_b K_b^{-1} p_b} K_b^{-1} p_b
\end{aligned}
$$<p>我们知道，$\rho_a, \rho_b$ 之间有一个变换矩阵 $T_{ab}$，有：</p>
$$
\rho_b = C_ba \rho_a + r_b^{ba}
$$<p>将 $\rho_a, \rho_b$ 变换为像素坐标，有：</p>
$$
\begin{aligned}
z_b K_b^{-1} p_b &= C_{ba} z_a K_a^{-1} p_a + r_b^{ba}\\
p_b &= \frac{z_a}{z_b} K_b C_{ba} K_a^{-1} p_a + \frac{1}{z_b}K_b r_b^{ba}
\end{aligned}
$$<p>将 $\frac{1}{z_b}$ 变换为 $\frac{z_a}{z_b}\frac{1}{z_a}$ ，且带入 $r_b^{ab} = -C_{ba} r_a^{ba}$，有：</p>
$$
\begin{aligned}
p_b &= \frac{z_a}{z_b} K_b C_{ba} K_a^{-1} p_a + \frac{z_a}{z_b} K_b C_{ba} r_a^{ba}\frac{n^T_a K_a^{-1} p_a}{d_a}\\
&= \frac{z_a}{z_b} K_b C_{ba} K_a^{-1} p_a + \frac{z_a}{z_b} K_b C_{ba} r_a^{ba}\frac{n^T_a}{d_a} K_a^{-1} p_a\\
&= \frac{z_a}{z_b} K_b C_{ba} \left(
    1 + \frac{r_a^{ba}n^T_a}{d_a}
\right)K_a^{-1}p_a
\end{aligned}
$$<p>其中 $\frac{z_a}{z_b}$ 为一个系数，可以被齐次坐标吸收。有：</p>
$$
p_b = K_b C_{ba} \left(
    1 + \frac{r_a^{ba}n^T_a}{d_a}
\right)K_a^{-1}p_a
$$<p>其中：</p>
$$
H_{ba} = C_{ba} \left(
    1 + \frac{r_a^{ba} n_a^T}{d_a}
\right)
$$<p>我们可以写出：</p>
$$
K_b^{-1} p_b = H_{ba} K_a^{-1} p_a
$$<p>我们可以这样理解：</p>
<ol>
<li>$K_b^{-1} p_b$ 和 $K_a^{-1} p_a$ 为归一化坐标系下的点</li>
<li>$H_{ba}$ 为一个 $3 \times 3$ 的矩阵，描述了两个归一化坐标系之间的变换</li>
</ol>


  </div>

  <footer class="post-footer">
    <ul class="post-tags">
      <li><a href="https://wangjv0812.github.io/WangJV-Blog-Pages/tags/homography/">Homography</a></li>
      <li><a href="https://wangjv0812.github.io/WangJV-Blog-Pages/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/">计算机视觉</a></li>
      <li><a href="https://wangjv0812.github.io/WangJV-Blog-Pages/tags/%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/">图像处理</a></li>
      <li><a href="https://wangjv0812.github.io/WangJV-Blog-Pages/tags/%E5%B0%84%E5%BD%B1%E5%87%A0%E4%BD%95/">射影几何</a></li>
    </ul>
<nav class="paginav">
  <a class="prev" href="https://wangjv0812.github.io/WangJV-Blog-Pages/2025/03/dust3r-and-must3r/">
    <span class="title">« Prev</span>
    <br>
    <span>DUSt3R and MUSt3R</span>
  </a>
  <a class="next" href="https://wangjv0812.github.io/WangJV-Blog-Pages/2024/12/dreamfusion/">
    <span class="title">Next »</span>
    <br>
    <span>DreamFusion</span>
  </a>
</nav>

  </footer>
</article>
    </main>
    
<footer class="footer">
        <span>&copy; 2025 <a href="https://wangjv0812.github.io/WangJV-Blog-Pages/">WangJV Blog</a></span> · 

    <span>
        Powered by
        <a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> &
        <a href="https://github.com/adityatelange/hugo-PaperMod/" rel="noopener" target="_blank">PaperMod</a>
    </span>
</footer>
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
        <path d="M12 6H0l6-6z" />
    </svg>
</a>

<script>
    let menu = document.getElementById('menu')
    if (menu) {
        menu.scrollLeft = localStorage.getItem("menu-scroll-position");
        menu.onscroll = function () {
            localStorage.setItem("menu-scroll-position", menu.scrollLeft);
        }
    }

    document.querySelectorAll('a[href^="#"]').forEach(anchor => {
        anchor.addEventListener("click", function (e) {
            e.preventDefault();
            var id = this.getAttribute("href").substr(1);
            if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
                document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
                    behavior: "smooth"
                });
            } else {
                document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
            }
            if (id === "top") {
                history.replaceState(null, null, " ");
            } else {
                history.pushState(null, null, `#${id}`);
            }
        });
    });

</script>
<script>
    var mybutton = document.getElementById("top-link");
    window.onscroll = function () {
        if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
            mybutton.style.visibility = "visible";
            mybutton.style.opacity = "1";
        } else {
            mybutton.style.visibility = "hidden";
            mybutton.style.opacity = "0";
        }
    };

</script>
<script>
    document.getElementById("theme-toggle").addEventListener("click", () => {
        if (document.body.className.includes("dark")) {
            document.body.classList.remove('dark');
            localStorage.setItem("pref-theme", 'light');
        } else {
            document.body.classList.add('dark');
            localStorage.setItem("pref-theme", 'dark');
        }
    })

</script>
<script>
    document.querySelectorAll('pre > code').forEach((codeblock) => {
        const container = codeblock.parentNode.parentNode;

        const copybutton = document.createElement('button');
        copybutton.classList.add('copy-code');
        copybutton.innerHTML = 'copy';

        function copyingDone() {
            copybutton.innerHTML = 'copied!';
            setTimeout(() => {
                copybutton.innerHTML = 'copy';
            }, 2000);
        }

        copybutton.addEventListener('click', (cb) => {
            if ('clipboard' in navigator) {
                navigator.clipboard.writeText(codeblock.textContent);
                copyingDone();
                return;
            }

            const range = document.createRange();
            range.selectNodeContents(codeblock);
            const selection = window.getSelection();
            selection.removeAllRanges();
            selection.addRange(range);
            try {
                document.execCommand('copy');
                copyingDone();
            } catch (e) { };
            selection.removeRange(range);
        });

        if (container.classList.contains("highlight")) {
            container.appendChild(copybutton);
        } else if (container.parentNode.firstChild == container) {
            
        } else if (codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName == "TABLE") {
            
            codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(copybutton);
        } else {
            
            codeblock.parentNode.appendChild(copybutton);
        }
    });
</script>
</body>

</html>
